home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / LINUX / NETLINK.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  5KB  |  159 lines

  1. #ifndef __LINUX_NETLINK_H
  2. #define __LINUX_NETLINK_H
  3.  
  4. #define NETLINK_ROUTE        0    /* Routing/device hook                */
  5. #define NETLINK_SKIP        1    /* Reserved for ENskip              */
  6. #define NETLINK_USERSOCK    2    /* Reserved for user mode socket protocols     */
  7. #define NETLINK_FIREWALL    3    /* Firewalling hook                */
  8. #define NETLINK_ARPD        8
  9. #define NETLINK_ROUTE6        11    /* af_inet6 route comm channel */
  10. #define NETLINK_IP6_FW        13
  11. #define NETLINK_TAPBASE        16    /* 16 to 31 are ethertap */
  12.  
  13. #define MAX_LINKS 32        
  14.  
  15. struct sockaddr_nl
  16. {
  17.     sa_family_t    nl_family;    /* AF_NETLINK    */
  18.     unsigned short    nl_pad;        /* zero        */
  19.     __u32        nl_pid;        /* process pid    */
  20.            __u32        nl_groups;    /* multicast groups mask */
  21. };
  22.  
  23. struct nlmsghdr
  24. {
  25.     __u32        nlmsg_len;    /* Length of message including header */
  26.     __u16        nlmsg_type;    /* Message content */
  27.     __u16        nlmsg_flags;    /* Additional flags */
  28.     __u32        nlmsg_seq;    /* Sequence number */
  29.     __u32        nlmsg_pid;    /* Sending process PID */
  30. };
  31.  
  32. /* Flags values */
  33.  
  34. #define NLM_F_REQUEST        1    /* It is request message.     */
  35. #define NLM_F_MULTI        2    /* Multipart message, terminated by NLMSG_DONE */
  36. #define NLM_F_ACK        4    /* If succeed, reply with ack    */
  37. #define NLM_F_ECHO        8    /* Echo this request         */
  38.  
  39. /* Modifiers to GET request */
  40. #define NLM_F_ROOT    0x100    /* specify tree    root    */
  41. #define NLM_F_MATCH    0x200    /* return all matching    */
  42. #define NLM_F_ATOMIC    0x400    /* atomic GET        */
  43. #define NLM_F_DUMP    (NLM_F_ROOT|NLM_F_MATCH)
  44.  
  45. /* Modifiers to NEW request */
  46. #define NLM_F_REPLACE    0x100    /* Override existing        */
  47. #define NLM_F_EXCL    0x200    /* Do not touch, if it exists    */
  48. #define NLM_F_CREATE    0x400    /* Create, if it does not exist    */
  49. #define NLM_F_APPEND    0x800    /* Add to end of list        */
  50.  
  51. /*
  52.    4.4BSD ADD        NLM_F_CREATE|NLM_F_EXCL
  53.    4.4BSD CHANGE    NLM_F_REPLACE
  54.  
  55.    True CHANGE        NLM_F_CREATE|NLM_F_REPLACE
  56.    Append        NLM_F_CREATE
  57.    Check        NLM_F_EXCL
  58.  */
  59.  
  60. #define NLMSG_ALIGNTO    4
  61. #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
  62. #define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(sizeof(struct nlmsghdr)))
  63. #define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
  64. #define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
  65. #define NLMSG_NEXT(nlh,len)     ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
  66.                   (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
  67. #define NLMSG_OK(nlh,len) ((len) > 0 && (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
  68.                (nlh)->nlmsg_len <= (len))
  69. #define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
  70.  
  71. #define NLMSG_NOOP        0x1    /* Nothing.        */
  72. #define NLMSG_ERROR        0x2    /* Error        */
  73. #define NLMSG_DONE        0x3    /* End of a dump    */
  74. #define NLMSG_OVERRUN        0x4    /* Data lost        */
  75.  
  76. struct nlmsgerr
  77. {
  78.     int        error;
  79.     struct nlmsghdr msg;
  80. };
  81.  
  82. #define NET_MAJOR 36        /* Major 36 is reserved for networking                         */
  83.  
  84. #ifdef __KERNEL__
  85.  
  86. struct netlink_skb_parms
  87. {
  88.     struct ucred        creds;        /* Skb credentials    */
  89.     __u32            pid;
  90.     __u32            groups;
  91.     __u32            dst_pid;
  92.     __u32            dst_groups;
  93.     kernel_cap_t        eff_cap;
  94. };
  95.  
  96. #define NETLINK_CB(skb)        (*(struct netlink_skb_parms*)&((skb)->cb))
  97. #define NETLINK_CREDS(skb)    (&NETLINK_CB((skb)).creds)
  98.  
  99.  
  100. extern int netlink_attach(int unit, int (*function)(int,struct sk_buff *skb));
  101. extern void netlink_detach(int unit);
  102. extern int netlink_post(int unit, struct sk_buff *skb);
  103. extern int init_netlink(void);
  104. extern struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len));
  105. extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);
  106. extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock);
  107. extern void netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid,
  108.                   __u32 group, int allocation);
  109. extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code);
  110.  
  111. /*
  112.  *    skb should fit one page. This choice is good for headerless malloc.
  113.  *
  114.  *      FIXME: What is the best size for SLAB???? --ANK
  115.  */
  116. #define NLMSG_GOODSIZE (PAGE_SIZE - ((sizeof(struct sk_buff)+0xF)&~0xF))
  117.  
  118.  
  119. struct netlink_callback
  120. {
  121.     struct sk_buff    *skb;
  122.     struct nlmsghdr    *nlh;
  123.     int        (*dump)(struct sk_buff * skb, struct netlink_callback *cb);
  124.     int        (*done)(struct netlink_callback *cb);
  125.     int        family;
  126.     long        args[4];
  127. };
  128.  
  129. extern __inline__ struct nlmsghdr *
  130. __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len)
  131. {
  132.     struct nlmsghdr *nlh;
  133.     int size = NLMSG_LENGTH(len);
  134.  
  135.     nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
  136.     nlh->nlmsg_type = type;
  137.     nlh->nlmsg_len = size;
  138.     nlh->nlmsg_flags = 0;
  139.     nlh->nlmsg_pid = pid;
  140.     nlh->nlmsg_seq = seq;
  141.     return nlh;
  142. }
  143.  
  144. #define NLMSG_PUT(skb, pid, seq, type, len) \
  145. ({ if (skb_tailroom(skb) < (int)NLMSG_SPACE(len)) goto nlmsg_failure; \
  146.    __nlmsg_put(skb, pid, seq, type, len); })
  147.  
  148. extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
  149.                   struct nlmsghdr *nlh,
  150.                   int (*dump)(struct sk_buff *skb, struct netlink_callback*),
  151.                   int (*done)(struct netlink_callback*));
  152.  
  153.  
  154. extern void netlink_proto_init(struct net_proto *pro);
  155.  
  156. #endif /* __KERNEL__ */
  157.  
  158. #endif    /* __LINUX_NETLINK_H */
  159.